import { Fields } from "@/types/public";

type DataObject = Record<string, any>;

/**
 * 根据配置将数据对象的属性转换为指定类型 和默认值
 * @param config 类型转换配置数组
 * @param data 需要转换的数据对象
 * @returns 转换后的新对象（不修改原对象）
 */
function convertTypes(
  config: Fields[],
  data: DataObject
): Record<string, unknown> {
  // 创建结果对象的浅拷贝
  const result = { ...data };

  // 遍历配置进行类型转换
  config.forEach(({ key, valueType, defaultValue }) => {
    if (key in result) {
      let value = result[key];
      if (value == undefined) value = defaultValue;
      try {
        // 根据配置执行类型转换
        if (valueType === "number") {
          result[key] = convertToNumber(value);
        } else if (valueType === "string") {
          result[key] = convertToString(value);
        }
      } catch (error) {
        console.error(`类型转换失败 [key=${key}, value=${value}]:`, error);
      }
    }
  });
  return result;
}

/**
 * 安全转换为数字类型
 * @param value 输入值
 * @returns 转换后的数字
 * @throws 转换失败时抛出错误
 */
function convertToNumber(value: any): number {
  // 处理布尔值
  if (typeof value === "boolean") {
    return value ? 1 : 0;
  }

  // 处理null/undefined
  if (value === null || value === undefined) {
    return 0;
  }

  // 处理数字字符串
  const num = Number(value);
  if (!isNaN(num)) return num;

  // 处理日期类型
  if (value instanceof Date) {
    return value.getTime();
  }

  throw new Error(`无法转换为数字: ${JSON.stringify(value)}`);
}

/**
 * 安全转换为字符串类型
 * @param value 输入值
 * @returns 转换后的字符串
 */
function convertToString(value: any): string {
  // 处理null/undefined
  if (value === null || value === undefined) {
    return "";
  }

  // 处理日期类型
  if (value instanceof Date) {
    return value.toISOString();
  }

  // 处理对象和数组
  if (typeof value === "object") {
    return JSON.stringify(value);
  }

  return String(value);
}

export default convertTypes;
